#include <iostream>
#include <signal.h>
#include <unistd.h>
using namespace std;

void handler(int signo)
{
    cout << "子进程退出了，父进程收到退出信号：" << signo << " 我是：" << getpid() << endl;
}
int main()
{
    signal(SIGCHLD, handler);
    pid_t id = fork();
    if (id == 0)
    {
        while (true)
        {
            cout << "我是子进程： " << getpid() << endl;
            sleep(1);
        }
        exit(0);
    }
    // 父进程
    while (true)
    {
        cout << "我是父进程： " << getpid() << endl;
        sleep(1);
    }
}




// test2
//  // 自定义实现信号处理
//  void Handler2()
//  {
//      cout << "Test Signal 2" << endl;
//  }
//  void Handler3()
//  {
//      cout << "Test Signal 3" << endl;
//  }
//  void Handler4()
//  {
//      cout << "Test Signal 4" << endl;
//  }
//  void Handler5()
//  {
//      cout << "Test Signal 5" << endl;
//  }
//  void Handler(int signo)
//  {
//      cout<<"pid: "<<getpid()<<endl;
//      switch (signo)
//      {
//      case 2:
//          Handler2();
//          break;
//      case 3:
//          Handler3();
//          break;
//      case 4:
//          Handler4();
//          break;
//      case 5:
//          Handler5();
//          break;
//      default:
//          break;
//      }
//  }

// int main()
// {
//     signal(2, Handler);
//     signal(3, Handler);
//     signal(4, Handler);
//     signal(5, Handler);

//     while (1)
//     {
//         sleep(1);
//     }

//     return 0;
// }

// test1
//  void handler(int signo)
//  {
//      cout << "获取到一个信号，信号的编号是： " << signo << endl;
//      // 增加handler信号的时间
//      // sleep(20);
//      // 或者
//      sigset_t pending;
//      while (true)
//      {
//          //模拟永远处理2号信号
//          cout<<"pid: "<<getpid()<<endl;
//          cout << "*" << endl;
//          for (int i = 1; i <= 31; i++)
//          {
//              if (sigismember(&pending, i))

//                 cout << "1";
//             else
//                 cout << "0";
//         }
//         cout << endl;
//         sleep(1);
//     }
// }
// int main()
// {
//     struct sigaction act, oact;
//     act.sa_handler = handler; // 自定义方法
//     // act.sa_handler = SIG_IGN;     //忽略信号
//     // act.sa_handler = SIG_DFL;     //默认信号
//     act.sa_flags = 0;
//     sigemptyset(&act.sa_mask);
//     sigaddset(&act.sa_mask,3);   //在拦住2号信号的同时，也拦住3号信号，这就是设置sa_mask的意义
//     sigaction(2, &act, &oact);
//     while (true)
//     {
//         cout << "main running" << endl;
//         sleep(1);
//     }
//     return 0;
// }